package it.traveldream.ManagedBeans;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import it.traveldream.EJB.GiftBean;
import it.traveldream.EJB.SBEJBBean;
import it.traveldream.EJB.UtenteEJB;
import it.traveldream.EJB.DTO.AlloggioDTO;
import it.traveldream.EJB.DTO.DisponibilitaDTO;
import it.traveldream.EJB.DTO.EscursioneDTO;
import it.traveldream.EJB.DTO.GiftListDTO;
import it.traveldream.EJB.DTO.PacchettoDTO;
import it.traveldream.EJB.DTO.UtenteDTO;
import it.traveldream.Util.GLView;
import it.traveldream.Util.GiftList_da_visualizzare;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

/**
 * @author pippogarett
 *ManagedBean per la gestione della gift List
 */


@ManagedBean (name="giftLMBean")
@SessionScoped
public class GiftListMBean {

	@EJB
	private UtenteEJB usrEJB;

	@EJB
	private SBEJBBean serbejb;
	
	@EJB
	private GiftBean giftListEJB;

	
	
	private GiftListDTO el_comprato;

	private PacchettoDTO pacchettoSel;

	private UtenteDTO cliente_cercato; // cliente del quale si vuole ottenere la gift list, serve solo lo username


	private ArrayList<GiftListDTO> listaGiftList;

	private ArrayList<GLView> giftList_visual;




	public GiftListMBean() {
		super();

		this.cliente_cercato = new UtenteDTO();
		this.listaGiftList = new ArrayList<GiftListDTO>();
		this.giftList_visual=new ArrayList<GLView>();
		this.el_comprato = new GiftListDTO();
		this.pacchettoSel = new PacchettoDTO();

	}

	/**
	 * Metodo chiamato dalla pagina che permette di acquistare un servizio base
	 * di un pacchetto tra quelli nella giftList {@link #giftList_visual}.
	 * @param idElemento - {@code idElemento} chiave della tabella giftlist del DB, corrispondente
	 * al servizio base che si vuole acquistare
	 */
	public void buyGiftElement(String idElemento){

		Iterator<GiftListDTO> iter_f = listaGiftList.iterator();
		GiftListDTO help = new GiftListDTO();
		Integer id_el = new Integer(idElemento);		//trasformo l'id che mi arriva dalla pagina da stringa a intero
		
		//Recuper il GiftListDTO corrispondente
		while(iter_f.hasNext()){

			help=iter_f.next();

			if (id_el == help.getIdElemento()){

				el_comprato = help;

				break;

			}

		}
		
		el_comprato.setAcquistato(1);
		el_comprato.setAcquistatoDa(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
		System.out.println("Ho comprato: " + el_comprato.getIdElemento());
		
		try {
			giftListEJB.updateGL(el_comprato);
			
			FacesContext.getCurrentInstance().addMessage("gift_list_growl",
					new FacesMessage(FacesMessage.SEVERITY_INFO, "Acquistato", "Servizio acquistato correttamente"));
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("gift_list_growl",
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Attenzione!",
							e.getMessage().substring(0, e.getMessage().indexOf(":"))));
		}
		
		
		this.retrievedGiftList();		//aggiorno la visualizzazione dopo averlo reso persistente

	}


	/**
	 * Comparatore che permette di ordinare i {@link GiftListDTO} recuperati dal DB, in ordine di {@code idPacchetto}
	 * @author marco
	 */
	static class PacketComparator implements Comparator<GiftListDTO>{

		@Override
		public int compare(GiftListDTO o1, GiftListDTO o2) {
			// TODO Auto-generated method stub
			return Integer.signum(o1.getPacchetto().getId()-o2.getPacchetto().getId());
		}



	}

	/**
	 * metodo che mi permette di prendere tutte le gift 
	 */
	public void retrievedGiftList(){

		//Se non è una chiamata ajax, ricarico i dati
		listaGiftList.clear();
		giftList_visual.clear();
		
		HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

		if(!origRequest.getServletPath().contains("other")){		//Se la richiesta non mi arriva dalla pagina di ricerca di un altro utente
			//Setto l'utente di cui recuperare la gift list come l'utente corretto
			cliente_cercato.setUsername(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
			System.out.println("Setto me stesso come utente gift list "+origRequest.getServletPath());
		}
		listaGiftList.addAll(usrEJB.getGiftListUser(cliente_cercato));

		System.out.println(listaGiftList.size());

		Collections.sort(listaGiftList,new PacketComparator());

		//costruisco anche l'array da visualizzare
		//variabili utili
		Iterator<GiftListDTO> iterGLDTO = listaGiftList.iterator();
		ArrayList<GiftListDTO> lista_per_pkt = new ArrayList<GiftListDTO>();
		int currentPktId = -1;
		GLView g;
		GiftListDTO help = new GiftListDTO();
		while(iterGLDTO.hasNext()){

			if (currentPktId == -1)
				help = iterGLDTO.next();

			currentPktId = help.getPacchetto().getId();

			lista_per_pkt.clear();
			g = new GLView();
			while(iterGLDTO.hasNext() && help.getPacchetto().getId()==currentPktId){
				g.setPrezzoCamera(this.getPrezzoCameraAlloggio(help.getPacchetto()));
				lista_per_pkt.add(help);
				help = iterGLDTO.next();
				if(!iterGLDTO.hasNext())
					lista_per_pkt.add(help);
			}

			
			g.fill(lista_per_pkt);
			
			giftList_visual.add(g);
			System.out.println("Numero Servizi Base in pacchetto: "+lista_per_pkt.size());

		}

		System.out.println("Numero Pacchetti in Gift List: "+giftList_visual.size());

	}



	/**
	 * verufuca che l'utente cercato esista
	 * @return-la pagina della giftlist dell'utente
	 */
	public String searchGiftLusr(){


		if (usrEJB.isAlreadyUser(cliente_cercato.getUsername())){
			
			//anche se l'outcome ritornato è show_my_gift_list, viene settato cliente_cercato all'utente che ha 
			//username preso dalla input text, quindi è corretto
			
			return "show_other_gift_list";		

		}else{

			FacesContext.getCurrentInstance().addMessage("growl_user_not_right",
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Attenzione!", "Utente non trovato"));


			return"#";

		}


	}


	
	
	
	public double getPrezzoCameraAlloggio(PacchettoDTO p){
		
		ArrayList<DisponibilitaDTO> d = serbejb.getDisponibilitaForAlloggio(p.getAlloggi());
		
		Iterator<DisponibilitaDTO> it = d.iterator();
		DisponibilitaDTO help = new DisponibilitaDTO();


		//Filtro le disponibilita per data di interesse, tipo di camera e numero sufficiente di camere.
		while(it.hasNext()){
			help = it.next();
			if(p.getdataPartenza().compareTo(help.getData()) <= 0
					&& p.getdataRitorno().compareTo(help.getData()) >= 0
					&&
					//Controllo che in questa data, ci sia il tipo di camera richiesta 
					p.getTipoCameraFromAlloggio().getTipoCamera().equalsIgnoreCase(help.getTipoCamera())
					){
				return help.getPrezzo();
			}
		}

		return 0;
	}
	

	//GETTER E SETTER

	public UtenteDTO getCliente_cercato() {
		return cliente_cercato;
	}

	public void setCliente_cercato(UtenteDTO cliente_cercato) {
		this.cliente_cercato = cliente_cercato;
	}







	public ArrayList<GiftListDTO> getListaGiftList() {
		return listaGiftList;
	}


	public GiftListDTO getEl_comprato() {
		return el_comprato;
	}





	public void setEl_comprato(GiftListDTO el_comprato) {
		this.el_comprato = el_comprato;
	}




	/**
	 * @return the giftList_visual
	 */
	public ArrayList<GLView> getGiftList_visual() {
		return giftList_visual;
	}


	/**
	 * @param giftList_visual the giftList_visual to set
	 */
	public void setGiftList_visual(ArrayList<GLView> giftList_visual) {
		giftList_visual = giftList_visual;
	}


	/**
	 * @return the pacchettoSel
	 */
	public PacchettoDTO getPacchettoSel() {
		return pacchettoSel;
	}


	/**
	 * @param pacchettoSel the pacchettoSel to set
	 */
	public void setPacchettoSel(PacchettoDTO pacchettoSel) {
		this.pacchettoSel = pacchettoSel;
	}




}







